PAT结构体作业 |
您所在的位置:网站首页 › 设有以下变量定义 char str › PAT结构体作业 |
PTA | 程序设计类实验辅助教学平台 (pintia.cn) (感谢浙大提供学习平台) 目录 判断题 选择题 1、结构体成员的类型必须是基本数据类型。(错) 解答:结构体(Struct)的成员类型不必只是基本数据类型,它可以包含基本数据类型、其他结构体、指针、数组等各种数据类型。结构体的目的是允许你将不同数据类型的成员组合在一起,以创建一个自定义的复合数据类型。这使得你可以更灵活地表示和组织数据。 例如,你可以创建一个结构体,其中包含整数、浮点数和字符串作为成员: struct Person { int age; float height; char name[50]; };在上述示例中,`Person` 结构体包含了不同数据类型的成员,包括 `int`、`float` 和字符数组 `char name[50]`。 因此,结构体的成员类型可以是基本数据类型,也可以是其他结构体,指针,数组等,以满足你在程序中所需的数据组织和表示的要求。 2、结构体类型本身不占用内存空间,结构体变量占用内存空间。(对) 解答:是的,结构体类型本身在内存中不占用空间,它只是一种用户定义的数据类型,用于描述多个不同数据类型的组合。当你创建一个结构体变量时,这个变量会占用内存空间,该空间大小取决于结构体内部成员的数据类型和大小。 例如,在下面的 C 语言代码中,定义了一个 `Person` 结构体类型,但是只有当你创建一个 `struct Person` 类型的变量时,内存才会分配给这个变量: struct Person { int age; float height; char name[50]; }; int main() { struct Person person1; // 创建一个 Person 结构体变量 // 现在,person1 变量占用了内存空间,包含了 age、height 和 name 成员 return 0; }在上述代码中,`struct Person person1;` 创建了一个 `Person` 类型的结构体变量 `person1`,这个变量占用了内存空间,其中包含了 `int` 类型的 `age`、`float` 类型的 `height` 和字符数组 `char name[50]`。 3、指向结构体变量的指针可以作函数参数,实现传址调用。(对) 解答:是的,指向结构体变量的指针可以作为函数参数,实现传址调用(pass by reference)。通过传递结构体变量的指针,你可以在函数内部直接修改结构体的内容,而不是传递结构体的副本。这样可以避免在函数调用时产生额外的内存开销。 下面是一个示例,演示了如何使用指向结构体的指针作为函数参数,实现传址调用: #include // 定义一个结构体类型 struct Person { int age; float height; }; // 函数,接受指向结构体的指针作为参数 void modifyPerson(struct Person *personPtr) { // 修改结构体的成员 personPtr->age = 30; personPtr->height = 5.9; } int main() { // 创建一个结构体变量 struct Person person1 = {25, 6.0}; // 输出修改前的结构体成员的值 printf("Before modification: Age = %d, Height = %.2f\n", person1.age, person1.height); // 调用函数,传递结构体变量的地址 modifyPerson(&person1); // 输出修改后的结构体成员的值 printf("After modification: Age = %d, Height = %.2f\n", person1.age, person1.height); return 0; }在上述示例中,`modifyPerson` 函数接受一个指向结构体 `Person` 的指针作为参数,然后修改了结构体的成员。通过传递结构体变量 `person1` 的地址(`&person1`),函数能够直接修改 `person1` 的内容,从而实现了传址调用。 4、假设结构指针p已定义并正确赋值,其指向的结构变量有一个成员是int型的num,则语句 *p.num = 100; 是正确的。(错) 解答:不是正确的。在C语言中,通过指针访问结构体成员需要使用`->`运算符,而不是`.`运算符。所以,如果结构体指针`p`指向的结构体变量有一个成员是int型的`num`,你应该使用`p->num = 100;`来正确赋值。这是因为`p->num`表示"p所指向的结构体变量的num成员"。而`*p.num`会被解释为"p所指向的结构体变量的num成员的值",这是错误的语法。 选择题1、设有如下定义,则错误的输入语句是( B)。 struct ss{ char name[10]; int age; char sex; } std[3], *p = std;A.scanf("%d", &(*p).age); B.scanf("%d", p->&age); C.scanf("%c", &std[0].sex); D.scanf("%c", &(p->sex)); 解答: 正确答案是 B. scanf("%d", p->&age);**。 在选项 B 中,`p->&age` 的语法是错误的。`p->` 表示取结构体指针 `p` 指向的结构体变量的成员,然后使用 `&` 取 `age` 成员的地址。这种语法是不允许的。 正确的写法应该是使用 `p->age`,表示取结构体指针 `p` 指向的结构体变量的 `age` 成员,然后直接将该成员的地址传递给 `scanf` 函数。所以,正确的语句应该是: scanf("%d", &(p->age)); 其他选项 A、C 和 D 的语法都是正确的。 2、若有以下结构体类型定义, struct worker { char name[16]; struct date{ int year; int month; int day; }birthday; }x; 则赋值语句正确的是( )。 A.x.year=1999; B.x.birthday.month=3; C.x.name="黎明"; D.x.birthday=1999.9.9; 解答:在给嵌套结构体成员赋值时,应该按照嵌套的结构体层级来访问成员。根据提供的结构体定义: struct worker { char name[16]; struct date { int year; int month; int day; } birthday; } x;正确的赋值语句是: B. `x.birthday.month = 3;` 这是因为 `birthday` 是 `worker` 结构体的一个成员,它本身是一个结构体,而 `month` 是 `birthday` 结构体的一个成员。所以,要给 `month` 赋值,应该使用 `x.birthday.month`。 其他选项的问题在于数据类型的匹配或者语法的错误: A. `x.year=1999;` - 这是错误的,因为`year`是`birthday`结构体的成员,应该通过`x.birthday.year`来赋值。 C. `x.name="黎明";` - 这是错误的,因为字符串的赋值应该使用strcpy函数,而不是直接赋值。 D. `x.birthday=1999.9.9;` - 这是错误的,因为试图将一个日期值直接赋给一个结构体的赋值是不允许的。你需要分别给`x.birthday.year`、`x.birthday.month`和`x.birthday.day`赋值。 3、有以下结构体说明、变量定义和赋值语句: struct SID { char name [10]; int age; char sex; }s[5],stu; 则以下 scanf函数调用语句有错误的是( )。 A.scanf("%s", s[0].name); B.scanf("%d", &s[0].age); C.scanf("%s", &stu.name); D.scanf("%d",& stu.sex); 解答: 在考虑 scanf 函数调用时,你需要确保传递的参数类型与 scanf 期望的格式化字符串中的占位符类型相匹配。根据提供的结构体定义: struct SID { char name[10]; int age; char sex; } s[5], stu;以下 scanf 函数调用是错误的: D. `scanf("%d", &stu.sex);` 因为 `stu.sex` 是一个 char 类型的变量,所以应该使用 `%c` 作为格式化字符串,而不是 `%d`。正确的 scanf 函数调用应该是: D. `scanf("%c", &stu.sex);` 在选项 A、B 中,格式化字符串和参数类型是匹配的,所以它们是正确的。 在这个情况下,`stu.name` 是一个字符数组,不需要使用取地址操作符 `&`。所以,正确的写法是: scanf("%s", stu.name); 对于字符数组,不需要使用 `&` 取地址,因为数组名本身就是数组的地址。所以,选项 C 是错误的。 4、有以下结构体说明、变量定义和赋值语句,则以下scanf函数调用语句有错误的是 struct STD { char name[10]; int age; char sex; } s[5],*ps; ps=&s[0];A.scanf("%c",&(ps->sex)); B.scanf("%d",ps->age); C.scanf("%s",s[0].name); D.scanf("%d",&s[0].age); 解答:在提供的结构体说明、变量定义和赋值语句中: struct STD { char name[10]; int age; char sex; } s[5], *ps; ps = &s[0];以下 `scanf` 函数调用语句是错误的: B. `scanf("%d", ps->age);` 这是因为 `age` 是一个 `int` 类型的成员,所以你应该使用 `&` 取地址操作符来传递正确的指针给 `scanf`。正确的写法是: B. `scanf("%d", &(ps->age));` 其他选项中的 `scanf` 函数调用是正确的: A. `scanf("%c", &(ps->sex));` - 正确,因为 `sex` 是一个 `char` 类型的成员。 C. `scanf("%s", s[0].name);` - 正确,因为 `name` 是一个字符数组,不需要取地址操作符 `&`。 D. `scanf("%d", &s[0].age);` - 正确,因为 `age` 是一个 `int` 类型的成员。 5、设有如下定义,则对data中的a成员的正确引用是()。 struct sk{ int a; double b; } data, *p = &data;A.(*p).data.a B.(*p).a C.p->data.a D.p.data.a 解答:正确的引用方式是: B. `(*p).a` 或者等价的: C. `p->a` 这是因为 `p` 是一个指向 `struct sk` 结构体的指针,使用 `->` 运算符或者间接引用(解引用)`*` 都可以访问 `p` 指向的结构体的成员。因此,`p->a` 和 `(*p).a` 都是引用 `data` 结构体变量中的 `a` 成员的正确方式。 6、对于以下结构定义,(*p)->str++中的++加在(D)。 struct { int len; char *str } *p;A.指针str上 B.指针p上 C.str指向的内容上 D.语法错误 解答:指针类型在调用其成员的时候才用-> 而*p已经是正常的结构体类型了,所以用.才对 7、对于以下结构定义,++p->str中的++加在()。 struct { int len; char *str } *p;A.指针str上 B.指针p上 C.str指向的内容上 D.语法错误 解答:这里的->优先级高于++,所以++p->str 就相等于++(p->str),由于str是指向char类型的指针,所以++加在了指针strs 上。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |